package it.kion.util.ui.umenumanager2.utils;

import it.kion.util.ui.umenumanager2.model.Item;

import java.util.StringTokenizer;

/**
 * @author Andrea Salicetti &lt;<a href="mailto:a.salicetti@kion.it">a.salicetti@kion.it</a>&gt;
 */
public class PathConverter {

	/**
	 * <p>
	 * Metodo di conversione per ottenere dal descrittore della vista (<code>&lt;view-id&gt;</code>), il relativo path sul workspace.
	 * </p>
	 * <b>Esempio</b>:
	 * <p>(<i>desktop.xml</i>)<br/> &nbsp; ...<br/> &nbsp;&lt;item id="nazioni"&gt;<br/> &nbsp; ...<br/> &nbsp;&nbsp; &lt;job&gt;<br/>
	 * &nbsp;&nbsp;&nbsp;&nbsp; &lt;business-process&gt;it.kion.sia.siaac.territorio.nazioni.NazioniBP&lt;/business-process&gt;<br/>
	 * &nbsp;&nbsp;&nbsp;&nbsp; ... <br/> &nbsp;&nbsp;&nbsp;&nbsp;
	 * <b>&lt;view-id&gt;/siaac/territorio/nazioni/nazioniMain.jsp&lt;/view-id&gt;</b> &nbsp; ===> <font color="green">
	 * siaac-web/web/siaac/territorio/nazioni/nazioniMain.jsp</font> <br/> &nbsp;&nbsp;&nbsp;&nbsp; ... <br/> &nbsp;&nbsp; &lt;/job&gt;<br/>
	 * &nbsp;&lt;/item&gt;<br/>
	 * <p>
	 * ...
	 * </p>
	 * 
	 * @author Andrea Salicetti
	 * @param BPAsIsInDesktopXML la stringa contenuta nel tag <code>business-process</code> del <code>desktop.xml</code>.
	 * @return il percorso su file system, relativo al workspace, per la classe java corrispondente a tale bp.
	 */
	public static String getPathForView(String ViewAsIsInDesktopXML) {
		String res = null;
		StringTokenizer st = new StringTokenizer(ViewAsIsInDesktopXML.trim(), "/");
		String token = st.nextToken();
		String moduleSuffix = token.substring(3);
		res = "sia" + moduleSuffix + "-web/web/" + token;
		while (st.hasMoreTokens()) {
			res += "/";
			String tk = st.nextToken();
			if(tk.endsWith(".jsf")){
				tk.replace(".jsf", ".jsp");
			}
			res += tk;
		}
		return res;
	}

	/**
	 * <p>
	 * Metodo di conversione per ottenere dal descrittore della vista (<code>&lt;view-id&gt;</code>), il relativo path del file di
	 * hierarchy sul workspace.
	 * </p>
	 * <b>Esempio</b>:
	 * <p>(<i>desktop.xml</i>)<br/> &nbsp; ...<br/> &nbsp;&lt;item id="nazioni"&gt;<br/> &nbsp; ...<br/> &nbsp;&nbsp; &lt;job&gt;<br/>
	 * &nbsp;&nbsp;&nbsp;&nbsp; &lt;business-process&gt;it.kion.sia.siaac.territorio.nazioni.NazioniBP&lt;/business-process&gt;<br/>
	 * &nbsp;&nbsp;&nbsp;&nbsp; ... <br/> &nbsp;&nbsp;&nbsp;&nbsp;
	 * <b>&lt;view-id&gt;/siaac/territorio/nazioni/nazioniMain.jsp&lt;/view-id&gt;</b> &nbsp; ===> <font color="green">
	 * siaac-web/web/siaac/territorio/nazioni/nazioniMain.jsp</font> <br/> &nbsp;&nbsp;&nbsp;&nbsp; ... <br/> &nbsp;&nbsp; &lt;/job&gt;<br/>
	 * &nbsp;&lt;/item&gt;<br/>
	 * <p>
	 * ...
	 * </p>
	 * 
	 * @author Andrea Salicetti
	 * @return il percorso su file system, relativo al workspace, per il file xml di hierarchy corrispondente alla vista facelets.
	 */
	public static String getPathForHierarchy(String ViewAsIsInDesktopXML) {
		String res = null;
		StringTokenizer st = new StringTokenizer(ViewAsIsInDesktopXML.trim(), "/");
		String token = st.nextToken();
		String moduleSuffix = token.substring(3);
		res = "sia" + moduleSuffix + "-model/src/java/it/kion/sia/sia" + moduleSuffix +"/hierarchy/";
		while (st.hasMoreTokens()) {
			String tk = st.nextToken();
			if(tk.endsWith("_main.xml")){
				tk = tk.replace("_main.xml", ".xml");
				int length = tk.length();
				res += tk.substring(0, length - 4) +  "/"; 
				tk = tk.replaceFirst(tk.substring(0, 1),tk.substring(0, 1).toUpperCase());
				res += tk;
			}
		}
		return res;
	}

	private static String getVerticalModuleSuffix(String viewAsIsInDesktopXML) {
		StringTokenizer st = new StringTokenizer(viewAsIsInDesktopXML.trim(), "/");
		String token = st.nextToken();
		// essendo la prima parte "siaxx", il suffisso mi da il nome del modulo.
		return token.substring(3);
	}

	/**
	 * <p>
	 * Metodo di conversione per ottenere dal descrittore del bp (<code>&lt;business-process&gt;</code>), il relativo path sul workspace.
	 * </p>
	 * <b>Esempio</b>:
	 * <p>(<i>desktop.xml</i>)<br/> &nbsp; ...<br/> &nbsp;&lt;item id="nazioni"&gt;<br/> &nbsp; ...<br/> &nbsp;&nbsp; &lt;job&gt;<br/>
	 * &nbsp;&nbsp;&nbsp;&nbsp; &lt;business-process&gt;it.kion.sia.siaac.territorio.nazioni.NazioniBP&lt;/business-process&gt; 
	 *  &nbsp; ===> <font color="green"> siaac-bp/it/siaac/territorio/nazioni/NazioniBP.java</font> <br/>
	 * &lt;view-id&gt;/siaac/territorio/nazioni/nazioniMain.jsp&lt;/view-id&gt;
	 * &nbsp;&nbsp;&nbsp;&nbsp; ... <br/> &nbsp;&nbsp; &lt;/job&gt;<br/>
	 * &nbsp;&lt;/item&gt;<br/>
	 * <p>
	 * ...
	 * </p>
	 * 
	 * @author Andrea Salicetti
	 * @param BPAsIsInDesktopXML la stringa contenuta nel tag <code>business-process</code> del <code>desktop.xml</code>.
	 * @return il percorso su file system, relativo al workspace, per la classe java corrispondente a tale bp.
	 */
	public static String getPathForBP(Item mi) {
		String res = null;
		String pathToClass = mi.getBusinessProcessClass().trim().replace('.', '/');
		pathToClass = pathToClass.trim();
		String moduleSuffix = getVerticalModuleSuffix(mi.getView());
		res = "sia" + moduleSuffix + "-bp/src/java/" + pathToClass + ".java";
		return res;
	}
	
	/**
	 * <p>
	 * Metodo di conversione per ottenere dal descrittore del bp (<code>&lt;business-process&gt;</code>), il relativo path al 
	 * componente EJB sul workspace (solo per funzioni MDD).
	 * </p>
	 * <b>Esempio</b>:
	 * <p>(<i>desktop.xml</i>)<br/> &nbsp; ...<br/> &nbsp;&lt;item id="nazioni"&gt;<br/> &nbsp; ...<br/> &nbsp;&nbsp; &lt;job&gt;<br/>
	 * &nbsp;&nbsp;&nbsp;&nbsp; &lt;business-process&gt;it.kion.sia.siaac.territorio.nazioni.NazioniBP&lt;/business-process&gt; 
	 *  &nbsp; ===> <font color="green"> siaac-bp/it/siaac/territorio/nazioni/NazioniBP.java</font> <br/>
	 * &lt;view-id&gt;/siaac/territorio/nazioni/nazioniMain.jsp&lt;/view-id&gt;
	 * &nbsp;&nbsp;&nbsp;&nbsp; ... <br/> &nbsp;&nbsp; &lt;/job&gt;<br/>
	 * &nbsp;&lt;/item&gt;<br/>
	 * <p>
	 * ...
	 * </p>
	 * 
	 * @author Andrea Salicetti
	 * @return il percorso su file system, relativo al workspace, per la classe java del component corrispondente a tale bp.
	 */
	public static String getPathForComponent(Item mi) {
		String res = null;
		String pathToClass = mi.getBusinessProcessClass().trim().replace('.', '/');
		pathToClass = pathToClass.trim();
		String moduleSuffix = getVerticalModuleSuffix(mi.getView());
		res = "sia" + moduleSuffix + "-ejb/src/java/it/kion/sia/sia" + moduleSuffix + "/comp/";
		StringTokenizer st = new StringTokenizer(mi.getView().trim(), "/");
		while (st.hasMoreTokens()) {
			String tk = st.nextToken();
			if(tk.endsWith("Main.xml")){
				tk = tk.replace("Main.xml", "RAUComponent.java");
				tk = tk.replaceFirst(tk.substring(0, 1),tk.substring(0, 1).toUpperCase());
				res += tk;
			}
		}
		return res;
	}
}
